{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "V96fc28ZXJbn"
   },
   "source": [
    "<p align=\"center\">\n",
    "    <img src=\"https://github.com/GeostatsGuy/GeostatsPy/blob/master/TCG_color_logo.png?raw=true\" width=\"220\" height=\"240\" />\n",
    "\n",
    "</p>\n",
    "\n",
    "## Simple Convolutional Neural Network (CNN) Image Classification Demonstration\n",
    "\n",
    "#### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "\n",
    "\n",
    "##### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1) | [GeostatsPy](https://github.com/GeostatsGuy/GeostatsPy)\n",
    "\n",
    "#### Honggeun Jo, Graduate Candidate, The University of Texas at Austin\n",
    "\n",
    "##### [LinkedIn](https://www.linkedin.com/in/honggeun-jo/?originalSubdomain=kr) | [GitHub](https://github.com/whghdrms) | [Twitter](https://twitter.com/HonggeunJ)\n",
    "\n",
    "\n",
    "### Workflow for training CNN to classify images\n",
    "\n",
    "This workflow demonstrates design and training of a CNN model to classify for a variety of synthetic labeled images.\n",
    "\n",
    "* a very simple, well-documented toy problem to support experiential learning \n",
    "\n",
    "### Convolutional Neural Networks\n",
    "\n",
    "Extension of the artifical neural network, based on the visual cortex:\n",
    "\n",
    "* extraction of features from overlapping receptive fields, over a hierarchy (not shown) and then recompose the whole image, our perception.\n",
    "\n",
    "* We don’t perceive all the ‘pixels’, our visual cortex interprets and summarizes patterns. Let’s make a machine to do this.\n",
    "\n",
    "**Regularization**: a constraint to reduce the sensitivity of the model to the data, to reduce model variance\n",
    "\n",
    "Receptive Fields\n",
    "\n",
    "* the use of receptive fields is a form of regularization\n",
    "\n",
    "* massive reduction in connections, weights and model parameters\n",
    "\n",
    "* effectively shrinking these potential weights to zero\n",
    "\n",
    "* while integrating / focusing on pixel patterns!\n",
    "\n",
    "We have access to operators to move from layer to layer (feature maps to feature maps) in our convolutional neural networks.  The common operators include:\n",
    "\n",
    "* **Convolution** – a weighting window / filter designed to extract features\n",
    "\n",
    "* **Pooling** – reduction in dimensionality, increase local translation invariance \n",
    "\n",
    "* **Depth-wise Pooling, Down Sampling** – 1x1 filter that combine channels, feature maps\n",
    "\n",
    "* **Activation** – use of an activation function to apply a nonlinear transformation to impart nonlinearity to the system\n",
    "\n",
    "* **Full-connected, feed forward** – see previous lecture \n",
    "\n",
    "For a demonstration of all of these operators, check out this [Python Jupyter Notebook](https://github.com/GeostatsGuy/PythonNumericalDemos/blob/master/SubsurfaceDataAnalytics_Convolution_Operators.ipynb)\n",
    "\n",
    "#### Objective \n",
    "\n",
    "I teach data analytics, geostatistics and machine learning. To demonstrate the basic construction of a convolutional neural networks, training and prediction.  \n",
    "\n",
    "* I use these examples in my lecture notes, see the lecture posted on my YouTube channel.\n",
    "\n",
    "* gain experiential learning with the nuts and bolts of convolutional neural networks\n",
    "\n",
    "Note, I just demonstrate the construction, training and prediction. There is no attempt to tune the convolutional neural network hyperparameters.\n",
    "\n",
    "#### Getting Started\n",
    "\n",
    "Here's the steps to get setup in Python with the GeostatsPy package:\n",
    "\n",
    "1. Install Anaconda 3 on your machine (https://www.anaconda.com/download/). \n",
    "2. From Anaconda Navigator (within Anaconda3 group), go to the environment tab, click on base (root) green arrow and open a terminal. \n",
    "3. In the terminal type: pip install geostatspy. \n",
    "4. Open Jupyter and in the top block get started by copy and pasting the code block below from this Jupyter Notebook to start using the geostatspy functionality. \n",
    "\n",
    "There are exampled below with these functions. You can go here to see a list of the available functions, https://git.io/fh4eX, other example workflows and source code. \n",
    "\n",
    "#### Load the required libraries\n",
    "\n",
    "The following code loads the required libraries.\n",
    "\n",
    "We will need some standard packages. These should have been installed with Anaconda 3.\n",
    "* [numpy](https://numpy.org/): To generate arrays <br>\n",
    "* [matplotlib](https://matplotlib.org/): Vilsualization purpose <br>\n",
    "* sklearn: for model metrics, confusion matrices, one hot encoder\n",
    "\n",
    "We also will need tensor flow, this will require an install as it is not available in Anaconda\n",
    "* [tensorflow > 2.0.0](https://www.tensorflow.org/learn): Design, compile and train neural network models"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "executionInfo": {
     "elapsed": 189,
     "status": "ok",
     "timestamp": 1621129211466,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "ag7inwQ-XJbv"
   },
   "outputs": [],
   "source": [
    "import numpy as np                                      # ndarrays for gridded data, our images\n",
    "import matplotlib.pyplot as plt                         # plotting                   \n",
    "import pandas as pd\n",
    "from sklearn.metrics import f1_score, accuracy_score, recall_score, confusion_matrix # model metrics\n",
    "from scipy.ndimage import gaussian_filter               # Gaussian filter for smoothing our images\n",
    "from sklearn.preprocessing import OneHotEncoder         # one hot encoder for our response feature\n",
    "\n",
    "import tensorflow as tf                                 # import tensor flow\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "from tensorflow.keras.models import Model\n",
    "\n",
    "assert tf.__version__.startswith('2.')                  # this will give you error if tensorflow < 2.0\n",
    "tf.keras.backend.set_floatx('float32')                  # default float to be 'float32' (Tensorflow only works with float8, 16, 32)\n",
    "\n",
    "physical_devices = tf.config.list_physical_devices('GPU') # constrain memory use to avoid a CUDNN_STATUS_ALLOC_FAILED error\n",
    "tf.config.experimental.set_memory_growth(physical_devices[0], True)\n",
    "\n",
    "seed = 73073                                            # set the random number seed for repeatability\n",
    "np.random.seed(seed)                                    \n",
    "\n",
    "cmap = plt.cm.inferno                                   # color map for plots\n",
    "\n",
    "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) # there are a lot of retrace warnings we can ignore\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "gegnx7Ak1FoV"
   },
   "source": [
    "#### Check Your Hardware\n",
    "\n",
    "Let's confirm that we have access to a properly configured GPU.\n",
    "\n",
    "* you should see a 'physcial_device:GPU' device listed below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "id": "w7PB4F9b1FoW",
    "outputId": "1cb97ff5-0aba-484a-f0e3-5ff129333c1e"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]"
      ]
     },
     "execution_count": 2,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tf.config.list_physical_devices('GPU')                  # check for a properly configured GPU"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No worries if you don't have a configured GPU as this workflow was tested in a CPU only environment and it ran.\n",
    "\n",
    "* likely a longer run time"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "KNzH3gY41FoX"
   },
   "source": [
    "#### Define Functions\n",
    "\n",
    "Let's define a couple of convenience functions for workflow brevity and read-ability\n",
    "\n",
    "* train and test accuracy over epochs performance plots\n",
    "* train and test prediction acurracy, confusion matrix plots\n",
    "* visualize the trained CNN filters\n",
    "* visualize the feature maps for a specific image classification case\n",
    "* visualize the last layer, the probability output from the softmax activation function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "executionInfo": {
     "elapsed": 583,
     "status": "ok",
     "timestamp": 1621130828337,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "di4QxA0b1FoX"
   },
   "outputs": [],
   "source": [
    "def model_performance(history,nepoch):                  # visualize error and loss, training and testing over Epochs     \n",
    "    plt.subplot(1,2,1)\n",
    "    plt.plot(history.history['loss'],c='red')\n",
    "    plt.plot(history.history['val_loss'],c='black')\n",
    "    plt.title('CNN Model Loss')\n",
    "    plt.ylabel('Testing Categorical Entropy'); plt.xlabel('Epoch'); plt.grid()\n",
    "    plt.legend(['train', 'test'], loc='upper right'); plt.xlim([0,nepoch]); plt.ylim([0,1])\n",
    "    \n",
    "    plt.subplot(1,2,2)\n",
    "    plt.plot(history.history['categorical_accuracy'],c='red')\n",
    "    plt.plot(history.history['val_categorical_accuracy'],c='black')\n",
    "    plt.title('CNN Model Accuracy')\n",
    "    plt.ylabel('Testing Proportion Correct Classification'); plt.xlabel('Epoch'); plt.grid()\n",
    "    plt.legend(['train', 'test'], loc='upper right'); plt.xlim([0,nepoch]); plt.ylim([0,1])\n",
    "    plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.1, wspace=0.3, hspace=0.3)\n",
    "    plt.show()\n",
    "    \n",
    "def model_cross_validation(model,X_train,X_test,y_train,y_test): # visualize misclassification error for training and testing data \n",
    "    y_train_predict = model.predict(X_train[:,:,:,0].reshape([ntrain,nx,ny,-1])) # predict over the training images\n",
    "    y_train_predict = np.argmax(y_train_predict,axis = 1) # assign the maximum probability category\n",
    "    \n",
    "    y_test_predict = model.predict(X_test[:,:,:,0].reshape([ntest,nx,ny,-1])) # predict over the testing images \n",
    "    y_test_predict = np.argmax(y_test_predict,axis = 1) # assign the maximum probability category\n",
    "    \n",
    "    plt.subplot(121)                                                \n",
    "    train_confusion_matrix = confusion_matrix(y_train,y_train_predict) # calculate and plot train confusion matrix\n",
    "    train_confusion_matrix = train_confusion_matrix/np.sum(train_confusion_matrix) \n",
    "    im = plt.imshow(train_confusion_matrix,cmap=cmap,vmin=0.0,vmax=1.0); plt.xlabel('Prediction'); plt.ylabel('Truth'); plt.title('Training Confusion Matrix')\n",
    "    ax = plt.gca(); ax.set_xticks([0,1]); ax.set_xticklabels(name)\n",
    "    ax.set_yticks([0,1]); ax.set_yticklabels(name)\n",
    "    cbar = plt.colorbar(im, orientation=\"vertical\", ticks=np.linspace(0, 1.0, 5))\n",
    "    cbar.set_label('Proportion', rotation=270, labelpad=20)\n",
    "    \n",
    "    plt.subplot(122)\n",
    "    test_confusion_matrix = confusion_matrix(y_test,y_test_predict) # calculate and plot train confusion matrix\n",
    "    test_confusion_matrix = test_confusion_matrix/np.sum(test_confusion_matrix) \n",
    "    im = plt.imshow(test_confusion_matrix,cmap=cmap,vmin = 0,vmax = 1.0)\n",
    "    plt.xlabel('Prediction'); plt.ylabel('Truth'); plt.title('Testing Confusion Matrix')\n",
    "    ax = plt.gca(); ax.set_xticks([0,1]); ax.set_xticklabels(name)\n",
    "    ax.set_yticks([0,1]); ax.set_yticklabels(name)\n",
    "    cbar = plt.colorbar(im, orientation=\"vertical\", ticks=np.linspace(0, 1.0, 5))\n",
    "    cbar.set_label('Proportion', rotation=270, labelpad=20)\n",
    "    \n",
    "    plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.1, wspace=0.3, hspace=0.3)\n",
    "    plt.show()\n",
    "    \n",
    "    print(f'            Train   Test')                  # print a table with train and test accuracy\n",
    "    print(f'precision: {accuracy_score(y_train.flatten(), y_train_predict):.4f}, {accuracy_score(y_test.flatten(), y_test_predict):.4f}')\n",
    "    print(f'recall:    {recall_score(y_train.flatten(), y_train_predict, average = \"weighted\"):.4f}, {recall_score(y_test.flatten(), y_test_predict, average = \"weighted\"):.4f}')\n",
    "    print(f'f1 score:  {f1_score(y_train.flatten(), y_train_predict, average = \"weighted\"):.4f}, {f1_score(y_test.flatten(), y_test_predict, average = \"weighted\"):.4f}')\n",
    "\n",
    "def visualize_filters(model):                           # visualize CNN filters\n",
    "    for layer in model.layers:\n",
    "        if 'conv' not in layer.name:                    # check if layers is a convolution\n",
    "            continue\n",
    "        filters, biases = layer.get_weights()\n",
    "        fmin, fmax = filters.min(), filters.max()       # normalize the filter weights for visualization\n",
    "        filters = (filters - fmin) / (fmax - fmin)\n",
    "        print('Convolution Layer Name: ' + layer.name + ', Shape: ' + str(filters.shape[0]) + ' x ' + str(filters.shape[1]) + ', Number of Channels: ' + str(filters.shape[3]) + '.')\n",
    "        nch = filters.shape[3]\n",
    "        for ich in range(0,nch):\n",
    "            plt.subplot(1,nch,ich+1)\n",
    "            im = plt.imshow(filters[:,:,0,ich],cmap=cmap,vmin=0.0,vmax=1.0)\n",
    "            ax = plt.gca(); ax.set_xticks([0,1,2]); ax.set_xticklabels([-1,0,1])\n",
    "            ax.set_yticks([0,1,2]); ax.set_yticklabels([-1,0,1])\n",
    "            cbar = plt.colorbar(im, orientation=\"vertical\", ticks=np.linspace(0.0, 1.0, 5))\n",
    "            cbar.set_label('Weights', rotation=270, labelpad=20)\n",
    "            plt.title('Filter ' + str(ich+1))\n",
    "        plt.subplots_adjust(left=0.0, bottom=0.0, right=0.5*nch, top=0.5, wspace=0.4, hspace=0.3)\n",
    "        plt.show()\n",
    "\n",
    "def vizualize_feature_maps(model,image):                # visualize CNN feature maps for a prediction case\n",
    "    ilayer = -1\n",
    "    for layer in model.layers:\n",
    "        ilayer = ilayer + 1\n",
    "        # check for convolutional layer\n",
    "        if 'conv' not in layer.name:\n",
    "            continue\n",
    "        model_trunc = Model(inputs=model.inputs, outputs=model.layers[ilayer].output) # truncate model to output feature maps\n",
    "        feature_maps = model_trunc.predict(X[image,:,:,0].reshape([1,nx,ny,-1]))        \n",
    "        print('Convolution Layer Name: ' + layer.name + ', Shape: ' + str(feature_maps.shape[1]) + ' x ' + str(feature_maps.shape[2]) + ', Number of Channels: ' + str(feature_maps.shape[3]) + '.')\n",
    "    \n",
    "        nch = feature_maps.shape[3]\n",
    "        plt.subplot(1,nch+1,1)\n",
    "        fig = plt.imshow(X[image,:,:,0], cmap=cmap)\n",
    "        fig.axes.get_xaxis().set_visible(False); fig.axes.get_yaxis().set_visible(False)\n",
    "        plt.title('Image ' + str(image) + ': ' + name[y[image]])\n",
    "    \n",
    "        for ich in range(0,nch):\n",
    "            plt.subplot(1,nch+1,ich+2)\n",
    "            im = plt.imshow(feature_maps[0, :, :, ich], cmap=cmap)\n",
    "            ax = plt.gca(); ax.set_xticks([]); ax.set_yticks([])\n",
    "            plt.title('Feature Map ' + str(ich+1))\n",
    "        \n",
    "        plt.subplots_adjust(left=0.0, bottom=0.0, right=0.5*nch, top=0.5, wspace=0.4, hspace=0.3)\n",
    "        plt.show()\n",
    "\n",
    "def visualize_last_layers(model, image):\n",
    "    ilayer = -1\n",
    "    for layer in model.layers:\n",
    "        ilayer = ilayer + 1\n",
    "        # check for convolutional layer\n",
    "        if 'dense' not in layer.name:\n",
    "            continue\n",
    "        model_trunc = Model(inputs=model.inputs, outputs=model.layers[ilayer].output) # truncate model to output feature maps\n",
    "        output_layer = model_trunc.predict(X[image,:,:,0].reshape([1,nx,ny,-1]))        \n",
    "\n",
    "        plt.subplot(1,2,1)\n",
    "        fig = plt.imshow(X[image,:,:,0], cmap=cmap)\n",
    "        fig.axes.get_xaxis().set_visible(False); fig.axes.get_yaxis().set_visible(False)\n",
    "        plt.title('Image ' + str(image) + ': ' + name[y[image]])\n",
    "\n",
    "        plt.subplot(1,2,2)\n",
    "        plt.title('Predicted Category Probabilities')\n",
    "        plt.bar(x = ['Random', 'Smooth'], height = output_layer.flatten()*100,color='red',edgecolor='black',alpha=0.2)\n",
    "        plt.xlabel('Image Categories'); plt.ylabel('Probability (\\%)')\n",
    "        plt.subplots_adjust(left=0.0, bottom=0.0, right=2.0, top=1.1, wspace=0.4, hspace=0.3)\n",
    "        plt.show()                "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "Ew5y-AjOXJbx"
   },
   "source": [
    "### Simple Convolutional Neural Network Example\n",
    "\n",
    "Let's start with a very simple problem. \n",
    "\n",
    "* **smoothed** and unsmoothed **random** image classification\n",
    "\n",
    "#### Make a Random Simple Dataset\n",
    "\n",
    "We make 100 simple images, 80 train and 20 test 12x12 monochrome images.\n",
    "\n",
    "* we do this for a very rapid, fast toy problem\n",
    "\n",
    "We make the random training and testing images and visualize some of the testing models with their labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 410
    },
    "executionInfo": {
     "elapsed": 1501,
     "status": "ok",
     "timestamp": 1621130830095,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "VvCi3CUUXJbx",
    "outputId": "5478c209-9afa-41a0-cd7b-c2c9ecbfe0db"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 21 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(seed)                                    # make synthetic images \n",
    "nmodel = 100; psmooth = 0.5; ptest = 0.2; nx = 12; ny = 12\n",
    "ntest = int(nmodel*ptest); ntrain = nmodel - ntest\n",
    "X = np.random.rand(nmodel,nx,ny,1)\n",
    "y = np.zeros(nmodel,dtype = int); name = ['random','smooth']\n",
    "X_train = np.zeros([ntrain,nx,ny,1]); y_train = np.zeros(ntrain,dtype = int)\n",
    "X_test = np.zeros([ntest,nx,ny,1]); y_test = np.zeros(ntest,dtype = int)\n",
    "\n",
    "for i in range(0,nmodel):\n",
    "    if np.random.rand() < psmooth:\n",
    "        X[i,:,:,0] = gaussian_filter(X[i,:,:,0], sigma=1)\n",
    "        y[i] = 1\n",
    "    if i < ntest:\n",
    "        X_test[i,:,:,0] = X[i,:,:,0]; \n",
    "        y_test[i] = y[i]\n",
    "    else:\n",
    "        X_train[i-ntest,:,:,0] = X[i,:,:,0]; \n",
    "        y_train[i-ntest] = y[i]\n",
    "\n",
    "y_train = y_train.reshape(ntrain,-1)  \n",
    "y_test = y_test.reshape(ntest,-1)         \n",
    "            \n",
    "c, r = 7, 3                                             # visualize labelled synthetic images\n",
    "plt.figure(figsize = (10,10))\n",
    "for i in range(c*r):\n",
    "    plt.subplot(r,c,i+1)\n",
    "    fig = plt.imshow(X[i,:,:,0],cmap=cmap)\n",
    "    fig.axes.get_xaxis().set_visible(False); fig.axes.get_yaxis().set_visible(False)\n",
    "    plt.title('Image ' + str(i) + ': ' + name[y[i]])\n",
    "\n",
    "plt.subplots_adjust(left=0.0, bottom=0.0, right=1.3, top=0.5, wspace=0.01, hspace=0.3)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "flSy63AZXJb1"
   },
   "source": [
    "#### Data Preprocessing\n",
    "\n",
    "First, we should preprocess our data. \n",
    "\n",
    "* our images have a range of [0,1] so we don't need min-max normalization \n",
    "\n",
    "* also as catetories (e.g., y_train and y_test) are non-ordinal categorical variables, we will apply one-hot-encode to make the variable more compatible with a neural network model. \n",
    "\n",
    "* should we have ordinal categories (e.g.,'first','second', and 'third'), we can just use categorical number (i.e., integer encode). Following figure presents how one-hot-encode works in our example:  \n",
    "\n",
    "| Predictor Feature Label | Predictor Feature Value | Random | Smooth |\n",
    "| :---------------------: | :---------------------: | :----: | :----: |\n",
    "| Random                  | 0                       | 1      | 0      |\n",
    "| Smooth                  | 1                       | 0      | 1      |\n",
    "\n",
    "\n",
    "To learn more about integer encoding and one-hot-encoding, please refer this lecture on [feature transformations](https://www.youtube.com/playlist?list=PLG19vXLQHvSC2ZKFIkgVpI9fCjkN38kwf)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "executionInfo": {
     "elapsed": 886,
     "status": "ok",
     "timestamp": 1621130830096,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "ZZWwR58UXJb2"
   },
   "outputs": [],
   "source": [
    "enc = OneHotEncoder(categories = [[0,1]])               # 0 -> [1, 0] (Random) and 1 -> [0, 1] (Smoothed)\n",
    "enc.fit(y_train)\n",
    "y_train_one_hot, y_test_one_hot = enc.transform(y_train), enc.transform(y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "vjGhQSKaXJb3"
   },
   "source": [
    "#### Step 1. Define Classification Convolutional Neural Network \n",
    "\n",
    "Now we will define our convolutional neural network\n",
    "\n",
    "* with keras frontend for tensor flow it is not too dificult to design our network\n",
    "\n",
    "* the overall architure looks like this:\n",
    "\n",
    "See image from this [blog post](https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53) by Sumit Saha.\n",
    "\n",
    "We cycle multiple layers of:\n",
    "\n",
    "* convolution and activation with ReLU and 25% drop out\n",
    "\n",
    "* max pooling\n",
    "\n",
    "After multiple cycles we have learning the features in the images we then finish with:\n",
    "\n",
    "* flattening the feature into a 1D vector\n",
    "\n",
    "* feed-forward, fully-connected artificial neural network with 8 output nodes for the probability of each category\n",
    "\n",
    "As specified below the model includes:\n",
    "\n",
    "* cycles of convolution with 3x3 kernels, stride = 2 for feature maps extent reduction (one half), and padding to avoid image dimension reduction related to filter size\n",
    "\n",
    "* feature maps transition from 12x12x1 [nx,ny,nchannel] to 6x6x3 to 3x3x6 and then a layer with a vector of 54 to an output layer with 2 output nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "executionInfo": {
     "elapsed": 400,
     "status": "ok",
     "timestamp": 1621130830097,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "bYGzEarE1Foc"
   },
   "outputs": [],
   "source": [
    "def CNN_model():                                        # CNN design function\n",
    "    model = tf.keras.Sequential()                       # define neural network model sequentially\n",
    "    # Feature map 1: (12x12x1) --> (6x6x3)\n",
    "    model.add(layers.Conv2D(3, kernel_size=(3,3), strides=2, input_shape=[nx,ny,1], padding=\"same\"))\n",
    "    model.add(layers.ReLU())\n",
    "    model.add(layers.Dropout(0.25))\n",
    "    # Feature map 2: (6x6x3) --> (3x3x6)\n",
    "    model.add(layers.Conv2D(6, kernel_size=(3,3), strides=2, padding=\"same\"))\n",
    "    model.add(layers.ReLU())\n",
    "    model.add(layers.Dropout(0.25))\n",
    "    # Flatten to vector layer: (3x3x6 --> (54)\n",
    "    model.add(layers.Flatten())\n",
    "    # Output layer: (54) --> 2 (i.e., each node corresponds to the probability to be each class)\n",
    "    model.add(layers.Dense(2, activation = 'softmax'))  # softmax activation function for classfier probabilities\n",
    "    # Compile the Neural Network - define Loss and optimizer to tune the associated weights\n",
    "    model.compile(loss='categorical_crossentropy', metrics=['categorical_accuracy'], optimizer='adam')\n",
    "    return model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "y7meszWgXJb4"
   },
   "source": [
    "#### Instantiate, Train the Convolutional Neural Network and Visualize the Model Performance in Training and Testing\n",
    "\n",
    "This includes the following steps:\n",
    "\n",
    "1. instantiate the CNN specified above \n",
    "\n",
    "2. train it with the 80 images in the training set\n",
    "\n",
    "3. visualize the training and testing accuracy over the Epochs of training\n",
    "\n",
    "4. write out the summary of the convolutional neural network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 831
    },
    "executionInfo": {
     "elapsed": 3622,
     "status": "ok",
     "timestamp": 1621130833784,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "u070bqWuXJb4",
    "outputId": "83745698-3699-4bef-b2fc-be0f50abf834",
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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+CH/1/jwQ98jqiRTslES2q5I/oxKMkVEioAyZcqwcePGYt+IOefYuHEjZcqUCToUEYmQbdu2sWXLlmB6MtPTYfly/3zChPxfZ9o0qFUL2rePTFxSrJSENjrS7bOqy4qIFAH16tVj3bp1exY0z6/t27cX+QSuTJky1KtXL+gwRCRCMn5vBZJk/vor/POPfz5+PIwaBWZ5u8bu3b4nc8AAiOXquBI1kWijS1r7rCRTRKQISExM5OCDDy7wdWbPns3hhx8egYhERMKT8Yd3IMNlly3zj6eeChMnwpIlcOihebvGF1/A5s0aKivZikQbXdLaZ31dIyIiIiL5lpKSAgTUk5mRZA4f7nsh8zNkdto0SEyEHj0iG5tICaYkU0RERETyLfAks2xZaNsWunb1Q2bzOm9u2jRfnbZixaiEKFISKckUERERkXwLfLhs06a+F/OMM3wRoIULwz9/5UpflVZDZUUiSkmmiIiIiORbSkoKpUuXpmIQPYHLlkFSkn9+yikQH5+3IbPvv+8fTzop8rGJlGBKMkVEREQk31JSUqhVqxaW16quBbVrF6xa9W+SWb06dO+etyGz06ZBs2bQuHH04hQpgZRkioiIiEi+paamBjMf8+efIS3t3yQT/JDZn3+G+fNzP3/LFpg9W0NlRaJAS5iIiIiIFGOrVq1i/fr1uR7XqFEjateunefrp6SkBLt8SeYks39/uPxy35t5xBE5n/+///neUCWZIhGnJFNERESkmNq2bRutWrVi27ZtuR7brFkzfvjhhzzfIyUlhRYtWuQnvILJKsmsWhV69vTzMkePhpyG8E6bBlWqQMeOUQ1TpCRSkikiIiJSTK1du5Zt27YxfPhwunXrlu1x48aN45VXXmH79u2UKVMm7Os754IbLrtsGVSr5udiZjZwoE8g586FDh2yPjc93Rf96dXLr5EpIhGlJFNERESkmEpOTgagV69edO7cOdvjfv/9d15++WVWrlxJy5Ytw77+33//zbZt24IZLrt8+d69mBn69YPSpf2Q2eySzG++gZQUDZUViRIV/hEREREpptasWQNAgwYNcjwuKZSsLcsYghqmlJQUgOB6MrNKMitVgt694e23fY9lVqZN82tr9uoV3RhFSiglmSIiIiLFVHJyMmZG3bp1czyuadOmQAwlmX//DevWZZ1kgq8y++uv8PnnWb8/bZqfi7nv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JTU1dc9xZsZBBx1E06ZNqVatGps2beKoo46ibt26QfwoIiIiUsIpyRQRKaLi4uJo1KgRjRo1ol+/fnu9t3nzZpYvX74n8Vy+fDk//fQTs2fPZvz48QDUq1ePo446iqOPPpqjjjqKdu3aUa5cuEspioiIiOSPkkwRkRhUpUoVjjjiCI444oi99n/00UdUrlyZuXPnMm/ePObNm8fEiRMBXxn3sMMO46ijjqJ9+/YcccQRtGjRgoQENQUiIiISOfrLQkSkGClVqhRHHXUURx111J59qampexLOuXPnMm7cOMaOHQtA2bJladOmDUccccSexDMpKYm4uLigfgQRERGJcUoyRUSKuZo1a9KnTx/69OkD+LmeK1eu5Ouvv2b+/Pl8/fXXvPDCC4wZMwaAihUrcvjhh9OoUSPq16+/11avXj0qV64c5I8jIiIiRZySTBGREiYuLm5PddpBgwYBkJaWxg8//MD8+fOZP38+CxYs4KOPPmL9+vU45/Y6v2LFinuSzqSkJFq3bk2bNm1o2bIlZcqUCeJHEhERkSJESaaIiBAfH0+rVq1o1aoVF1xwwZ79u3btYv369axduzbL7bPPPtuzzEp8fDzNmzffk3S2adOG1q1bU7NmzYB+KhEREQmCkkwREclWYmIiDRo0oEGDBlm+n56ezqpVq1i4cOGebfbs2bzxxht7jqlTpw5z586lfv36hRW2iIiIBEhJpoiI5FtcXBxNmjShSZMmnHbaaXv2//777yxatIiFCxfy3XffUbt27QCjFBERkcKkJFNERCKuRo0aHH/88Rx//PFBhyIiIiKFTDXqRUREREREJGKUZIqIiIiIiEjEKMkUERERERGRiFGSKSIiIiIiIhGjJFNEREREREQiRkmmiIiIiIiIRIySTBEREREREYkYJZkiIiIiIiISMUoyRUREREREJGKUZIqIiIiIiEjEKMkUERERERGRiFGSKSIiIiIiIhGjJFNEREREREQiRkmmiIiIiIiIRIySTBEREREREYkYJZkiIiIiIiISMUoyRUREREREJGKUZIqIiIiIiEjEKMkUERERERGRiFGSKSIiIiIiIhGjJFNEREREREQiRkmmiIiIiIiIRIySTBEREREREYkYJZkiIiIiIiISMUoyRUREREREJGKUZIqIiIiIiEjEKMkUERERERGRiFGSKSIiIiIiIhGjJFNE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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_2\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_3 (Conv2D)            (None, 6, 6, 3)           30        \n",
      "_________________________________________________________________\n",
      "re_lu_3 (ReLU)               (None, 6, 6, 3)           0         \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 6, 6, 3)           0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 3, 3, 6)           168       \n",
      "_________________________________________________________________\n",
      "re_lu_4 (ReLU)               (None, 3, 3, 6)           0         \n",
      "_________________________________________________________________\n",
      "dropout_4 (Dropout)          (None, 3, 3, 6)           0         \n",
      "_________________________________________________________________\n",
      "flatten_2 (Flatten)          (None, 54)                0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 2)                 110       \n",
      "=================================================================\n",
      "Total params: 308\n",
      "Trainable params: 308\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "nepoch = 40; batch_size = 5                             # training parameters\n",
    "\n",
    "tf.random.set_seed(seed) \n",
    "model = CNN_model()                                     # instantiate model\n",
    "history = model.fit(X_train[:,:,:,0].reshape([ntrain,nx,ny,-1]), y_train_one_hot.todense(), \n",
    "                     batch_size=batch_size, epochs=nepoch, verbose=0, \n",
    "                     validation_data=(X_test[:,:,:,0].reshape([ntest,nx,ny,-1]), y_test_one_hot.todense()))\n",
    "    \n",
    "model_performance(history,nepoch)                       # plot loss and accuracy over training Epochs\n",
    "model.summary()                                         # write out the model summary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "ABYnyPTB1Foe"
   },
   "source": [
    "#### Predict with the Trained Convolutional Neural Network\n",
    "\n",
    "Now we load the trained deeper CNN classifier and visualize its prediction performance\n",
    "\n",
    "* we predict over the training and testing image datasets\n",
    "\n",
    "* we predict with the category assigned the maximum probability by our model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 451
    },
    "executionInfo": {
     "elapsed": 693,
     "status": "ok",
     "timestamp": 1621130835277,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "cmo5m_mg1Foe",
    "outputId": "a5ecf913-32d4-4dfc-ad22-b5f93e2da47a"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "            Train   Test\n",
      "precision: 1.0000, 1.0000\n",
      "recall:    1.0000, 1.0000\n",
      "f1 score:  1.0000, 1.0000\n"
     ]
    }
   ],
   "source": [
    "model_cross_validation(model,X_train,X_test,y_train,y_test) # predict and cross validate CNN classifier"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "TCdW3Dpz1Foe"
   },
   "source": [
    "### Interogate the Trained Convolutional Neural Network\n",
    "\n",
    "#### Visualize the Convolution Filters\n",
    "\n",
    "We can access and visualize the convolution weights. The follow code:\n",
    "\n",
    "* loops over the layers and finds the convolution layers\n",
    "\n",
    "* loops over the channels and plots all of the filters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 408
    },
    "executionInfo": {
     "elapsed": 1382,
     "status": "ok",
     "timestamp": 1621130837142,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "CpD7lzFR1Foe",
    "outputId": "a81f62b1-6595-4257-e0b4-5f364cc02e21"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Convolution Layer Name: conv2d_3, Shape: 3 x 3, Number of Channels: 3.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Convolution Layer Name: conv2d_4, Shape: 3 x 3, Number of Channels: 6.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 12 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize_filters(model)                                # visualize all of the CNN filter weights"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "eaXVG_WK1Fof"
   },
   "source": [
    "These are small 3 x 3 filters, but we can recognize some common structures:\n",
    "\n",
    "* averaging / smoothing\n",
    "\n",
    "* gradient\n",
    "\n",
    "* edge / sharpen (sobel)\n",
    "\n",
    "and combinations of these structures.\n",
    "\n",
    "* it makes sense that averaging, edge and gradient filters would differentiate the random and smooth images.\n",
    "\n",
    "#### Visualize the Feature Maps\n",
    "\n",
    "Let's vizualize the feature maps for prediction problem \n",
    "\n",
    "* you can specify the image below from 0 - 99"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 383
    },
    "executionInfo": {
     "elapsed": 814,
     "status": "ok",
     "timestamp": 1621130838486,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "XnLPYab81Fof",
    "outputId": "88ec9c8a-5b15-4a2c-b7f0-2310af83ed4b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Convolution Layer Name: conv2d_3, Shape: 6 x 6, Number of Channels: 3.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Convolution Layer Name: conv2d_4, Shape: 3 x 3, Number of Channels: 6.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 7 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "image = 52                                               # selected prediction case image from 0 - 99\n",
    "vizualize_feature_maps(model, image)                     # function to visualize the feature maps"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "58f4xmgS6ui8"
   },
   "source": [
    "\n",
    "#### Visualize the Output Layer\n",
    "\n",
    "Let's vizualize the output layer which contains the probability to be each categories (e.g., random or smooth)\n",
    "\n",
    "* you can specify the image below from 0 - 99"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 222
    },
    "executionInfo": {
     "elapsed": 456,
     "status": "ok",
     "timestamp": 1621130868139,
     "user": {
      "displayName": "HONGGEUN JO",
      "photoUrl": "https://lh3.googleusercontent.com/a-/AOh14GjjMrjKxVvTiBoV4qCmbZQiE5mDJaodEzKxwowf=s64",
      "userId": "13788572619033134064"
     },
     "user_tz": 300
    },
    "id": "H808m7u-6nK-",
    "outputId": "b6310f05-53af-4c99-a8bc-63d7eba1d79d"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "image = 51                                               # selected prediction case image from 0 - 99\n",
    "visualize_last_layers(model, image)                      # function to visualize the output layer"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "a1Mas1bP1Fof"
   },
   "source": [
    "#### Other Convolutional Neural Network Architecture Examples\n",
    "\n",
    "Some other examples of layers that could be added to the above CNN\n",
    "\n",
    "1. More dense layers, ANN feed forward\n",
    "\n",
    "```python\n",
    "    model.add(layers.Dense(512))\n",
    "    model.add(layers.BatchNormalization(momentum=0.8))\n",
    "    model.add(layers.ReLU())\n",
    "    model.add(layers.Dropout(0.25))\n",
    "```\n",
    "\n",
    "2. Max pooling 2D layers\n",
    "\n",
    "```python\n",
    "    model.add(layers.MaxPooling2D((2, 2)))\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "juCdblHCXJb_"
   },
   "source": [
    "#### Comments\n",
    "\n",
    "This was a very simple convolutional neural network workflow to support experiential learning with fast experientation.  \n",
    "\n",
    "The Texas Center for Data Analytics and Geostatistics has many other demonstrations on the basics of working with DataFrames, ndarrays, univariate statistics, plotting data, declustering, data transformations, trend modeling and many other workflows available [here](https://github.com/GeostatsGuy/PythonNumericalDemos), along with a package for geostatistics in Python called [GeostatsPy](https://github.com/GeostatsGuy/GeostatsPy). \n",
    "  \n",
    "We hope this was helpful,\n",
    "\n",
    "*Michael* and *Honggeun*\n",
    "\n",
    "***\n",
    "\n",
    "#### More on Michael Pyrcz and the Texas Center for Data Analytics and Geostatistics:\n",
    "\n",
    "### Michael Pyrcz, Associate Professor, University of Texas at Austin \n",
    "*Novel Data Analytics, Geostatistics and Machine Learning Subsurface Solutions*\n",
    "\n",
    "With over 17 years of experience in subsurface consulting, research and development, Michael has returned to academia driven by his passion for teaching and enthusiasm for enhancing engineers' and geoscientists' impact in subsurface resource development. \n",
    "\n",
    "For more about Michael check out these links:\n",
    "\n",
    "#### [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n",
    "\n",
    "#### Want to Work Together?\n",
    "\n",
    "I hope this content is helpful to those that want to learn more about subsurface modeling, data analytics and machine learning. Students and working professionals are welcome to participate.\n",
    "\n",
    "* Want to invite me to visit your company for training, mentoring, project review, workflow design and / or consulting? I'd be happy to drop by and work with you! \n",
    "\n",
    "* Interested in partnering, supporting my graduate student research or my Subsurface Data Analytics and Machine Learning consortium (co-PIs including Profs. Foster, Torres-Verdin and van Oort)? My research combines data analytics, stochastic modeling and machine learning theory with practice to develop novel methods and workflows to add value. We are solving challenging subsurface problems!\n",
    "\n",
    "* I can be reached at mpyrcz@austin.utexas.edu.\n",
    "\n",
    "I'm always happy to discuss,\n",
    "\n",
    "*Michael*\n",
    "\n",
    "Michael Pyrcz, Ph.D., P.Eng. Associate Professor The Hildebrand Department of Petroleum and Geosystems Engineering, Bureau of Economic Geology, The Jackson School of Geosciences, The University of Texas at Austin\n",
    "\n",
    "#### More Resources Available at: [Twitter](https://twitter.com/geostatsguy) | [GitHub](https://github.com/GeostatsGuy) | [Website](http://michaelpyrcz.com) | [GoogleScholar](https://scholar.google.com/citations?user=QVZ20eQAAAAJ&hl=en&oi=ao) | [Book](https://www.amazon.com/Geostatistical-Reservoir-Modeling-Michael-Pyrcz/dp/0199731446) | [YouTube](https://www.youtube.com/channel/UCLqEr-xV-ceHdXXXrTId5ig)  | [LinkedIn](https://www.linkedin.com/in/michael-pyrcz-61a648a1)\n"
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "SubsurfaceDataAnalytics_ConvolutionalNeuralNetworks_Classfier_VerySimple_HJ_review.ipynb",
   "provenance": [],
   "toc_visible": true
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
